﻿#ifndef h_baseH
#define h_baseH

namespace h_base
{
class HStream
{
public :
   HStream()
   {
      FRecLen = -1;
   }
   virtual ~HStream();
   virtual int ReadLine(char *Line, int MaxLen,
      bool TabToSpace)
   {
      fprintf(stderr, "HStream::ReadLine!!!\n");
      return -1;
   }
   virtual void WriteLine(const char *Line)
   {
   }
   virtual int ReadRec(char *Buf, int MaxLen)
   {
      return -1;
   }
   virtual int WriteRec(const char *Rec, int Len)
   {
      return 0;
   }
   virtual int GetRecLen()
   {
      return FRecLen;
   }
   int ReadLine(char *Line, int MaxLen)
   {
      return ReadLine(Line, MaxLen, true);
   }
protected :

   int FRecLen;
};

class HFileStream : public HStream
{
public :
   HFileStream(FILE *File);
   virtual ~HFileStream();
   virtual int ReadLine(char *Line, int MaxLen,
      bool TabToSpace);
   virtual void WriteLine(const char *Line);
   virtual int ReadRec(char *Buf, int MaxLen);
   virtual int WriteRec(const char *Rec, int Len);
   FILE *GetFile()
   {
      return FFile;
   }
   int ReadLine(char *Line, int MaxLen)
   {
      return ReadLine(Line, MaxLen, true);
   }
private :
   FILE *FFile;
   char *FLine;
};

class HMemStream : public HStream
{
public :
   HMemStream(void *Buf = NULL, int Len = 0);
   virtual int ReadLine(char *Line, int MaxLen,
      bool TabToSpace);
   virtual void WriteLine(const char *Line);
   char *GetBuf(void);
   int GetLength(void);
   int ReadLine(char *Line, int MaxLen)
   {
      return ReadLine(Line, MaxLen, true);
   }
private :
   vector<char> FMem;
   int FPos;
};

// 对字符串中的环境变量进行求值
   string EnvEvaluate(const string &Str);

// 判断一个字符是否在一个字符串内
   bool CharInStr(char c, const char *Str);

// 从文件f中读入一行到s，到文件尾返回-1，否则返回s的长度
// 如果一行超过MaxLen，则截取前面MaxLen个字符返回，后面的丢弃
// 行中如果有'\t'或者'\0'则替换成空格
// 填写到s的内容不包含最后的换行符
   int ReadLine(FILE *f, char *s, int MaxLen, bool TabToSpace = true);

// 从字符串s中获得子串，如果separators含有空格则忽略开头空格，返回
// 子串的下一个字符的位置
   int ReadWord(const char *s, char *w, const char *separators, int MaxLen);

// 将字符串s按照分隔符Delimiter拆成字符串数组
   void SplitString(const string &s, char Delimiter,
      vector<string> &Text, bool TrimSpace = false);

// SplitString的逆操作
   string JoinStrings(const vector<string> &Vec, char Delimiter);

// 将路径分解为目录、文件和后缀
   void SplitPath(const string &Path, string &DirName, string &BaseName,
      string &Postfix);

// 去除字符串尾部空格
   void RightTrim(string &Str);

// 转换成大写
   void ToUpper(string &Str);

// 转换成小写
   void ToLower(string &Str);

// 转换成大写
   void ToUpper(char *s);

// 转换成小写
   void ToLower(char *s);

// 压缩文本文件
   bool TextFileCompress(const string &SrcFileName,
      const string &DesFileName);
   bool TextFileCompress_old(const string &SrcFileName,
      const string &DesFileName);

// 解压缩文本文件
   bool TextFileDecompress(const string &SrcFileName,
      const string &DesFileName);
   bool TextFileDecompress_old(const string &SrcFileName,
      const string &DesFileName);

// 计算hash值
   unsigned int Hash(const void *Buf, int Len);

// 字符串转换成数值
   int StrToInt(const char *Str);
   int StrToInt(const string &Str);
   int HexStrToInt(const char *Str);
   float StrToFloat(const char *Str);
   double StrToDouble(const char *Str);
   long double StrToLongDouble(const char *Str);

};

#endif
